package br.com.ufc.contoller;

import br.com.ufc.model.TarefaTO;
import java.util.Arrays;

import br.com.ufc.exception.BusinessException;
import br.com.ufc.exception.IntegrationException;
import br.com.ufc.model.Tarefa;
import br.com.ufc.model.TarefaDesenvolvimento;

public class AgendaArray implements Agendavel {

    private Tarefa[] tarefas;

    public Tarefa[] getTarefas() {
        return tarefas;
    }

    public void setTarefas(Integer tamanhoArray) {
        this.tarefas = new Tarefa[tamanhoArray];
    }

    public Tarefa consultarTarefaPorCodigo(Long codigo)
            throws IntegrationException {
        for (Tarefa t : this.tarefas) {
            if ((t != null) && (t.getCodigo().intValue() == codigo.intValue())) {
                return t;
            }
        }
        throw new IntegrationException("Nenhuma tarefa com o c�digo " + codigo.intValue());
    }

    public Tarefa consultarTarefa(Long codigo) throws IntegrationException {
        for (Tarefa t : this.tarefas) {
            if ((t != null) && (t.getCodigo().intValue() == codigo.intValue())) {
                return t;
            }
        }
        throw new IntegrationException("INFO: Nenhuma tarefa com o c�digo "
                + codigo.intValue());
    }

    public Boolean encerrarTodasTarefas() {
        for (int i = 0; i < this.tarefas.length; i++) {
            if (this.tarefas[i] != null) {
                this.tarefas[i].encerrarTarefa(0D);
            }
        }
        return true;

    }

    public Boolean removerTarefa(Tarefa t) {
        if (t != null) {
            if (t.getCodigo().intValue() == t.getCodigo().intValue()) {
                for (int i = 0; i < this.tarefas.length; i++) {
                    if (this.tarefas[i].getCodigo().intValue() == t.getCodigo().intValue()) {
                        this.tarefas[i] = null;
                        break;
                    }
                }
                return true;
            }
        }
        return false;
    }

    public Boolean iniciarTarefa(Tarefa t) {
        if (t != null) {
            return t.iniciarTarefa();
        } else {
            return false;
        }
    }

    public Boolean encerrarTarefa(Tarefa t, Double valorCobrado) {
        if (t != null) {
            t.encerrarTarefa(valorCobrado);
            return true;
        } else {
            return false;
        }
    }

    public Boolean cadastrarTarefa(Tarefa t) {
        // Esta classe nao funcionara bem, caso t seja uma instancia de
        // TarefaDesenvolvimentoAuto
        Long indice = retornaPrimeiroIndiceLivre();
        if (indice != null){
            t.setCodigo(indice + 1);
            tarefas[indice.intValue()] = t;
            return true;
        } else {
            return false;
        }
        
    }

    public Long retornaPrimeiroIndiceLivre() {
        for (int i = 0; i < this.tarefas.length; i++) {
            if (this.tarefas[i] == null) {
                return new Long(i);
            }
        }
        return null;
    }

    @Override
    public void incrementarImportancia(Tarefa t) {
        t.incrementarImportancia();
    }

    @Override
    public Boolean cancelarTarefa(Tarefa t) {
        return t.cancelarTarefa();
    }

    @Override
    public Boolean reiniciarTarefa(Tarefa t) throws BusinessException {
        if (t instanceof TarefaDesenvolvimento) {
            return ((TarefaDesenvolvimento) t).reinicarTarefa();
        } else {
            throw new BusinessException(
                    "N�o � poss�vel reiniciar uma tarefa do tipo GERENCIAL");
        }
    }

    @Override
    public TarefaTO listarTarefas() {
        TarefaTO aTO = new TarefaTO();
        aTO.setListaTarefas(Arrays.asList(this.tarefas));
        return aTO;
    }

    public void iniciarTarefa(Long codigo) throws IntegrationException {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void cancelarTarefa(Long codigo) throws IntegrationException {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void encerrarTarefa(Long codigo, Double valorCobrado) throws IntegrationException {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void removerTarefa(Long codigo) throws IntegrationException {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void reiniciarTarefa(Long codigo) throws IntegrationException {
        throw new UnsupportedOperationException("Not supported yet.");
    }
    
    
}
